package clases;

import java.sql.Date;
import java.util.ArrayList;
import utilidades.*;


/**
 *
 * @author Agus Note
 */
public class Producto {
    
    private String codigo;
    private String nombre;
    private float precioVenta;
    private float precioPublico;
    private ArrayList materiasPrimas; //Lista de codigos de MP que componen el producto (por las dudas,todavia no se usa)
    private Envase envase;
    private ArrayList listaComponentes; //Lista de trios costo materia prima-cantidad-CodigoMP de esa materia prima
    private ArrayList preciosAntiguos;
    private BaseDatos baseDatos;
    private float costo; //Utiliza datos de la composicion 

    public Producto() {
    }

    public Producto(String codigo, String nombre,Envase envase) {
        this.codigo = codigo;
        this.nombre = nombre;
        materiasPrimas=new ArrayList();
        listaComponentes=new ArrayList();
        preciosAntiguos=new ArrayList();
        costo=0;
        this.envase=envase;
        precioVenta=0;
        baseDatos = new BaseDatos();
        precioPublico=0;
       
        
    
    }

    public String getCodigo() {
        return codigo;
    }

    public float getPrecioPublico() {
        return precioPublico;
    }

    public float getPrecioVenta() {
        return precioVenta;
    }

    public void setPrecioPublico(float precioPublico) {
        this.precioPublico = precioPublico;
    }

    public void setPrecioVenta(float precioVenta) {
        this.precioVenta = precioVenta;
    }
    
    public float getCosto() {
        return costo;
    }

    public String getNombre() {
        return nombre;
    }

    public Envase getEnvase() {
        return envase;
    }

    public void setEnvase(Envase envase) {
        this.envase = envase;
    }

    
    public void setCodigo(String codigo) {
        this.codigo = codigo;
    }

    public void setCosto(float costo) {
        this.costo = costo;
    }

    public void setNombre(String nombre) {
        this.nombre = nombre;
    }

    public ArrayList getListaComponentes() {
        return listaComponentes;
    }

    public ArrayList getMateriasPrimas() {
        return materiasPrimas;
    }

    public ArrayList getPreciosAntiguos() {
        return preciosAntiguos;
    }

   
    
    public void agregarPrecioAntiguo(Date fecha,float precio){
        HistorialPrecios precioAntiguo= new HistorialPrecios(fecha,precio);
        this.preciosAntiguos.add(precioAntiguo);      
    }
    public void eliminarPrecioAntiguo(Date fecha){
         HistorialPrecios aEliminar = (HistorialPrecios)Metodos.devolvemeElPrecio(fecha,preciosAntiguos);
         preciosAntiguos.remove(aEliminar);
    }
    
    public void modificarPrecioAntiguo(Date fecha,float precio){
        HistorialPrecios precioAMod = (HistorialPrecios)Metodos.devolvemeElPrecio(fecha, preciosAntiguos);
        precioAMod.setPrecioAnterior(precio);
    }
    
    
    public float consultarPrecioAntiguo(Date fecha){
       HistorialPrecios ret = (HistorialPrecios)Metodos.devolvemeElPrecio(fecha,preciosAntiguos);
       return ret.getPrecioAnterior();
    }
    
    
    
    
    public void actualizarCosto(){
        int i = 0;
        Composicion aux;
        this.costo = 0;
        float costoMP,cantidadMP;
        int lon = listaComponentes.size();
        while (i < lon){
            aux = (Composicion)listaComponentes.get(i);
            costoMP = aux.getCosto();
            cantidadMP=aux.getCantidad();
            this.costo =this.costo+costoMP*cantidadMP;//CostoMP debe estar guardado en precio por kilo/litro y CantidadMP en cantidad de kilos
            i++;
        }
        this.costo=this.costo+this.envase.getCosto();
        
        
    }
    
  
    
    private void agregarElementoDeComposicion(String codigoMP,float costoMP,float cantidadMP){
        Composicion nuevoTrio = new Composicion(costoMP,cantidadMP,codigoMP);
        this.materiasPrimas.add(codigoMP);
        this.listaComponentes.add(nuevoTrio);
    }
    
    public void eliminarElementoDeComposicion(String codigoMP){
        MateriaPrima mp = new MateriaPrima(codigoMP);        
    }
    
    //Cambia la cantidad de materia prima que se usa en la composicion del producto
    
  
    
    public void cambiarCantidadEnComposicion(String codigoMP,float cantidad){
        Composicion comp = new Composicion (codigoMP);
        int pos = listaComponentes.indexOf(comp);
        Composicion aCambiar = (Composicion)listaComponentes.get(pos);
        aCambiar.setCantidad(cantidad);
        updateCantidadEnBD(cantidad,codigoMP,this.codigo);
      
        
        
    }

    @Override
    public String toString() {
        String ret = "Nombre: "+this.nombre+"\n"
                + "Codigo: "+this.codigo+"\n"
                + "Costo: "+this.getCosto()+"\n"
                + "Codigos de las materias primas: "+ this.materiasPrimas.toString()+"\n"
                + "Composicion: "+this.listaComponentes.toString();
        return ret;
    }
    
    
    
    
    public float consultarCantidadDeMPEnComposicion(String codigoMP){
        float ret = 0;
        Composicion aux = null;
        int i = 0, lon = listaComponentes.size();
        while (i<lon){
            aux = (Composicion)listaComponentes.get(i);
            if (aux.getCodigoMP().equals(codigoMP)){
                ret = aux.getCantidad();
                i=i+lon;
            }
            i++;           
        }
        return ret;
    }
    
    

    @Override
    public boolean equals(Object obj) {
        Producto aux = (Producto)obj;
        return codigo.equals(aux.getCodigo());
    }
   
//*********************************** SENTENCIAS SQL ************************************************
    
    public void almacenarProductoEnBD(){
        if(this.baseDatos.conectarse()){
       
      
            String comando ="INSERT into producto (codigo,nombre,costo,precioVenta,precioPublico) values ('"
                    + this.codigo+ "','"
                    + this.nombre+ "',"
                    + this.costo + ","
                    + this.precioVenta + ","
                    + this.precioPublico+")";       
         
            baseDatos.ejecutarSQL(comando);
            
            
            
            baseDatos.desconectarse();
        }}
    
    public void updateDatosDeProductoEnBD(){
        if (this.baseDatos.conectarse()){
            
            
            String comando ="UPDATE producto "
                           +"SET codigo = '" + this.codigo
                           +"'"+ ",nombre = '" + this.nombre +"',"
                           +"costo = " + this.costo+","
                           +"precioVenta = " + this.precioVenta+","
                           +"precioPublico = " + this.precioPublico+" "
                           +"WHERE codigo = "+this.codigo;
            
        
           baseDatos.ejecutarSQL(comando);
           baseDatos.desconectarse();                          
        }
    }
        
    
    public void almacenarComposicionEnBD(){
         if(this.baseDatos.conectarse()){
           Composicion aux = null;
           String comando = "";
           int i = 0, lon = this.listaComponentes.size();
           while (i<lon){comando = "";
                aux = (Composicion) listaComponentes.get(i);
                 comando = "INSERT into compone (codigoInternoMP,codidoProducto,cantidad) values ( '" 
                                 + aux.getCodigoMP() + "','"
                                 + this.codigo + "',"
                                 + aux.getCantidad();
                 System.out.println(comando);
                 baseDatos.ejecutarSQL(comando);
                i++;
         }
            
            baseDatos.desconectarse();
    }  
    }
/**
     * Actualiza los valores de la tabla compone
     * @param cantidad
     * @param codigoMP
     * @param codigo 
     */
    public void updateCantidadEnBD(float cantidad, String codigoMP, String codigo) {       
        if (this.baseDatos.conectarse()){
        String consulta = "UPDATE compone "
                +         "SET cantidad = " + cantidad
                +         "WHERE (codigoInternoMP = " +codigoMP+ " AND codigoProducto = "+codigo
                +         ");";
        baseDatos.ejecutarSQL(consulta);
        baseDatos.desconectarse();
                
                }
        
    }
    
    public void almacenarHistorialEnBD(){
        String comando = "";
        int i = 0, lon = this.preciosAntiguos.size();
        HistorialPrecios aux = null;
        while (i<lon){
            comando = "";
            aux = (HistorialPrecios) preciosAntiguos.get(i);
            comando = "INSERT into historial_precio_produto (fecha,codigoProducto,costo) values ('"+
                      aux.getFecha()+"','"+
                      this.codigo+"',"+
                      aux.getPrecioAnterior()+")";
            i++;
                    
        }        
    }
    
    public void updateHistorialEnDB(){
        String comando = "";
        int i = 0, lon = this.preciosAntiguos.size();
        HistorialPrecios aux = null;
        while (i<lon){
            comando = "";
            aux =(HistorialPrecios) preciosAntiguos.get(i);
            comando = "UPDATE historial_precio_producto"
                    + "SET fecha = '"+aux.getFecha()+"', costo = "+aux.getPrecioAnterior()
                    + "WHERE codigoProducto = '" + this.codigo+"'";
            i++;
        }
    }
    
   
   
    
   
    
    
}
